package com.cy.pj.module.controller;

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;


@RestController
public class ParamObjectController {

    /**
     * 直接量方式传值(客户端参数名要与方法参数名一致一致)
     */
    @RequestMapping("/doHandleRequestParam1")
    public String doHandleRequestParam1(String name){
        return "request param is:"+name;
    }

    /**
     * @RquestParam 可以描述方法参数，表示是否需要写该参数
     * 默认客户端必须要给服务端传参数
     * 只能接收?形式传递的参数
     * 不传值会有400异常
     */
    @RequestMapping("/doHandleRequestParam2")
    public String doHandleRequestParam2(String name, @RequestParam(required = false) Date startDate){
        return "request param is:"+name+"/startDate is:"+startDate;
    }

    /**
     * Rest风格的url定义
     * 一种软件架构编码风格，这种风格中定义了url的一种格式
     * /a/{b}/c/d/{e} 其中{}中的内容是变量
     *      -->/a/100/c/d/erer
     * @PathVariable 描述参数，用于获取rest url的变量值
     * 参数名要和url中的参数值相同
     */
    @RequestMapping("/doHandleRequestParam3/{id}/{code}")
    public String doHandleRequestParam3(@PathVariable Integer id,@PathVariable String code){
        return "request param is:"+id+"/code:"+code;
    }

    /**
     * 通过方法中的pojo对象来接受请求中参数数据
     * pojo中的set方法需要与请求参数的参数名匹配
     */
    @RequestMapping("/doHandleRequestParam4")
    public String doHandleRequestParam4(RequestParameter requestParameter){
        return "request parameters:"+requestParameter;
    }

    /**
     * 使用pojo对象接收rest风格url中变量的值时，不需要加@PathVariable注解
     */
    @RequestMapping("/doHandleRequestParam5/{name}/{startDate}")
    public String doHandleRequestParam5(RequestParameter requestParameter){
        return "request parameters:"+requestParameter;
    }

    /**
     * 使用map接收请求参数(一般不推荐，因为没有校验，无法对请求参数进行限制)
     * 使用map接收请求参数需要用@RequestParam注解描述
     */
    @RequestMapping("/doHandleRequestParam6")
    public String doHandleRequestParam6(@RequestParam Map<String,Object> map){
        return "request parameters:"+map.toString();
    }
    /**
     * 当使用map接收rest风格url中参数的时候需要使用@PathVariable注解描述
     * 不能使用@RequestParam注解
     */
    @RequestMapping("/doHandleRequestParam7/{name}/{startDate}")
    public String doHandleRequestParam7(@PathVariable Map<String,Object> map){
        return "request parameters:"+map.toString();
    }
}
